home *** CD-ROM | disk | FTP | other *** search
- *cX Curso de programación
- orientada a objetos (III)
-
- *cR Teoria y uso de los streams
- *c^
- Otra de esas nuevas cositas "filosóficas"
- que nos proporciona la POO es el envio de
- mensajes a los objetos (de esto ya hemos
- hablado), y la pantalla, como el disco u
- otros sistemas de comunicación, son objetos
- y como tales se define una nueva forma de
- interactuación. Frente a los betustos y a
- veces frustrantes *cAprintf()*c^ y *cAfread()*c^
- se define ahora *cAcin*c^ i *cAcout*c^ (dentro de
- la libreria *cAiostream.h*c^) que aceptan cual-
- quier tipo de datos predefinidos y cual-
- quiera que le podamos definir en un futuro
- (esto es una cosa fantástica que veremos
- más adelante).
-
- Antes, con *cAprintf*c^, por ejemplo, teniamos
- que decir de que tipo de datos se trataba lo
- que queriamos escribir:
-
- *cH printf("Mi casa es de color %s", color);
- *c^
- Ahora eso ya no hace falta, simplemente
- llamamos para escribir lo que haya
- que escribir que ya se las arreglará el com-
- pilador para saber de que tipo son los datos.
- La sintaxis de C++ para escribir en streams
- (que así se llaman en inglés los ficheros,
- entre los que se encuentra la pantalla (aquí
- todo son ficheros, como en UNIX!! :) se po-
- dria ejemplificar así:
- *cH cout << "Mi casa es de color " << color;
- *c^
- Por supuesto, se pueden meter más signos
- *cA<<*c^ para seguir escribiendo más cosas e
- incluso para hacer retornos de carros y todo
- lo que se podia hacer con el C tradicional.
- Al igual que el objeto *cAcout*c^ redirige a la
- salida estandar, el antes mencionado *cAcin*c^
- hace lo própio con la entrada estandar.
- Además en otro número veremos como todo esto
- es tambien aplicable a los ficheros de
- nuestro disco duro haciendonos la vida más
- facil.
- *cR
- Métodos inline
- *c^
- Los métodos inline son el sustituto natural
- de las macros de C. Han de definirse e imple-
- mentarse obligatoriamente detro de la própia
- definición de la clase y no pueden ser está-
- ticos (ya veremos que es ésto). Un ejemplo
- podria ser el siguiente:
- *cH
- class Inlines {
- private:
- int status;
- [...]
- public:
- [...]
- inline int error(void) { return status; }
- [...]
- };
- *c^
- Observa que la definición y el cuerpo del
- método van unidos y no hay que redefinirlo
- en ningún otro sítio. Esta función de ejemplo,
- lo único que hace es devolver un valor de una
- variable privada que supuestamente controla
- los errores de la clase; por ello podria re-
- sultar un poco lento implementarlo como un
- método normal (porque habria que añadir una
- llamada a procedimiento y demás).
- *cR
- Constructores y destructores
- *c^
- Muchas veces, si programas en Pascal usando
- TPUs, habrás usado la parte de la TPU que se
- ejecuta siempre que se incluye ésta, para
- inicializar variables o mostrar mensajes,
- pero tambien otras veces te hubiera podido
- hacer falta hacer lo mismo para acabar y no
- lo has podido hacer. Los constructores de
- C++ son unos métodos que se ejecutan cada vez
- que creas una instancia de un objeto y que te
- permiten inicializar variables, pedir
- memoria, etc. Los destructores son un método
- que tiene cada clase y que se ejecuta al eli-
- minarse cada objeto instanciado.
- Para ver la potencia de los constructores y
- destructores podemos imaginar que queremos
- crear una clase que maneje una lista de núme-
- ros complejos u otros objetos de forma diná-
- mica (pidiendo memoria cada vez que se añade
- un elemento y liberandola cada vez que se
- elimina uno). Si usaramos los métodos
- tradicionales, tendriamos que pedir memoria
- explícitamente en cada método, usando el pa-
- radigma de la OO podemos crear un constructor
- que cada vez que se instancie un objeto, re-
- serve la memoria suficiente para contenerse y
- luego automáticamente se libere esa memoria.
- La definición de los constructores es bas-
- tante sencilla: se trata de un método que no
- devuelve nada y que tiene el mismo nombre que
- la clase que lo contiene. De forma similar,
- el destructor es un método que no devuelve
- nada y tampoco recibe parámetros de entrada
- y cuyo nombre es el mismo de la clase,
- pero precedido del signo tilde *cA~*c^ (ALT+126).
- Un ejemplo:
- *cH
- class Coche {
- [...]
- public:
- [...]
- Coche(char **Marca, char **Modelo);
- ~Coche();
- };
-
- Coche :: Coche(char **Marca, char **Modelo) {
- [...]
- }
-
- Coche :: ~Coche() {
- [...]
- }
- *c^
- Podemos observar que la definición debe
- estar en la parte pública ya que si no fuese
- así, el compilador no podria acceder a los
- métodos *cACoche*c^ y *cA~Coche*c^. Hay que observar tam-
- bien, que el destructor NUNCA puede llevar
- parámetros, mientras el constructor puede
- llevarlos o no.
- *cR
- La herencia
- *c^
- Como parábola de la realidad, la heréncia
- es una forma de que los que vienen después
- cojan lo que se ha creado por/para los que
- habia antes. Imaginemos que tenemos una
- clase "Avion" en la que están definidas una
- série de abstracciones generales de todos los
- aviones (combustible, altura máxima, peso,
- etc). Ahora queremos hacer una clase
- "Bombardero" y nos encontramos con el pro-
- blema de que tenemos que reescribir todos los
- métodos anteriores junto con las variables y
- demás. ¿Como solucionar ésto? Con la herencia.
- Si de alguna manera pudiesemos aprovechar el
- trabajo realizado con "Avion" y no tenerlo
- que reescribir para "Bombardero" estariamos
- ganando mucho tiempo y trabajo. Si hacemos
- que la clase "Bombardero" HEREDE de "Avion",
- solucionamos el problema; podriamos hacerlo
- así:
- *cH
- class Avion {
- private:
- int combustible;
- int velocidad;
- public:
- void acelera(int v);
- Avion();
- ~Avion();
- };
-
- class Bombardero : public Avion {
- private:
- int num_bombas;
- public:
- inline int lanza(void)
- { return --num_bombas; }
- Bombardero();
- ~Bombardero();
- };
- *c^
- La primera clase ("Avion") no tiene nada
- nuevo, pero la clase "Bombardero" ya va te-
- niendo en la primera línea cosas "extrañas".
- Con ese tipo de definición, lo que queremos
- decirle al compilador es: "defineme una
- clase llamada Bombardero que herede pública-
- mente (lo que era publico que lo siga siendo)
- de la clase Avion todos sus atributos". Así,
- en la clase "Bombardero", no tendremos
- como privada sólo 1 variable ("num_bombas"),
- sino que tendremos 3, las 2 de "Avion" y la
- própia. De la misma forma, no tendremos como
- pública sólo el método "lanza()" y el
- constructor+destructor, sino que heredamos el
- método "acelera()" de la clase padre.
- *cR
- Uso de directivas del compilador
- *c^
- No sólo para la POO es necesario usar bien
- las directivas que te ofrece el compilador,
- es una forma de hacer más robusto y legible
- nuestro código. Las que se usan principal-
- mente suelen ser *cA#ifdef*c^, *cA#ifndef*c^, *cA#endif*c^ e
- *cA#include*c^. No hay mucho que decir acerca de
- todas ellas, pues su uso está claro, pero es
- muy interesante que comienzes a meterlas por
- tus clases para que el compilador no te de
- grandes errores. Un uso frequente y que
- recomiendo es el siguiente:
- *cH
- // Fichero "claseA.hpp"
-
- #ifndef __CLASE_A__
- #define __CLASE_A__
-
- class A {
- [...]
- };
-
- #endif
- *cR
- Reglas prácticas para compilar
- *c^
- Si estas muy habituado a usar C sin crearte
- ficheros de proyecto, puede que caigas muchas
- veces (hasta que te acostumbres) en el error
- de incluir tanto la definición como la imple-
- mentación de cada una de las clases usadas.
- Si lo haces así e incluyes una misma clase
- en 2 lugares distintos, el compilador te dará
- un error de duplicación en la definición.
- Para evitar todos los errores de este tipo,
- lo mejor es tener claro donde debes poner las
- directivas del compilador y usar los ficheros
- de proyecto. Para usarlos sólo tienes que
- crear uno con el entorno que te proporciona
- el compilador e insertar allí todos los
- ficheros auxiliares que uses. Además, sólo
- deberás incluir los ficheros de definición de
- cada clase usada y nunca la implementación de
- éstas.
- Ya hay suficiente por éste número, en el
- próximo intentaremos ver nuestros primeros
- programas compilables, pero hasta entonces
- es muy recomendable que vayas investigando
- por tu cuenta (hay muchas clases interesantes
- en los compiladores comerciales).
- Hasta la vista.
-
- *cG Navi Dj.
-